package com.itheima.d10_api_object;

import java.util.Objects;

/**
 *public String toString()  调用toString()方法可以返回对象的字符串表示形式。
 *     默认的格式是：“包名.类名@哈希值16进制”
 * toString()方法存在的意义就是为了被子类重写，以便返回对象具体的内容
 *
 * public boolean equals(Object o) 判断两个对象是否相等。
 * equals方法默认的功能和==一样都是比较两个对象的地址，但是这很少用，因为直接比较两个对象的地址是否相同完全可以用“==”替代equals
 * 主要作用：equals存在的意义就是为了被子类重写，以便子类自己来定制比较规则（比如比较对象内容）。
 *
 * protected Object clone()   对象克隆
 * 当某个对象调用这个方法时，这个方法会复制一个一模一样的新对象返回。
 */
public class Student { // extends Object{
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // equals本身也是比较对象的地址，和"=="没有区别，"=="比较对象的地。
    // 重写equals方法,比较两个对象的内容一样就返回true.
    // 比较者：s2 == this(是s2调用的equals方法，所以此时this指向的对象地址就是s2里面的对象地址)
    // 被比较者：s1 == o（s1就是给形参O的）
    @Override
    public boolean equals(Object o) {
        // 1、判断两个对象是否地址一样，一样直接返回true.
        if (this == o) return true;

        // 2、判断o是null直接返回false, 或者，使用getClass方法比较者（s2）的类型与被比较者（s1）的类型不一样，返回false
        //   为什么要调用object类的getClass方法，因为防止例如：Student.class !=  Pig.class，两个比较对象的类型都不一样
        //this.getClass的this是可以省略的
        if (o == null || this.getClass() != o.getClass()) return false;

        // 3、o不是null，且o一定是学生类型的对象。因为O是object类型接收的，所以先进行强转，然后开始比较内容了！
        Student student = (Student) o;
        //这个this也是可以省略的，以防以后看别人的代码看不懂。并且调用的objects的equals方法，而不是object的equals方法
        //objects是一个工具类，object是所有类的父类.public final class Objects extends Object
        return this.age == student.age && Objects.equals(this.name, student.name);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
